const { findUserByAccount, findUserById, findUserList, insertUser } = require('../model/user.js');
const { creatToken, getUser } = require('../utils/index.js');

// 登录
exports.doLogin = async ctx => {
  // 1、获取请求体
  let { account, password } = ctx.request.body;
  if (!account || !password) {
    ctx.faild({
      msg: '必须传递用户名和密码'
    })
    return
  }

  // 2、查询用户的信息
  const res = await findUserByAccount(account)
  if (res.length === 0) {
    return ctx.faild({
      msg: '用户信息不存在'
    })
  }

  // 3、验证密码是否一致
  let user = res[0]
  if (user.password !== password) {
    return ctx.faild({
      msg: '密码输入不正确'
    })
  }

  // 4、生成token 并响应
  const userparams = {
    id: user.id,
    account: user.account,
    type: user.role_id
  }
  const token = creatToken(userparams)

  // 5、返回 token
  ctx.success({
    msg: '登录成功',
    token
  })
}

// 获取用户信息
exports.getInfo = async ctx => {
  const user = ctx.state.user;
  if (!user) return ctx.faild({ msg: '用户信息获取失败' })
  const { id } = user;
  const res = await findUserById(id)
  const info = res[0];
  if (!info) return ctx.faild({ msg: '用户信息不存在' })
  ctx.success({ msg: '查询成功', roles: [{ name: info.role_name }] })
}

// 退出
exports.logout = async ctx => {
  // 如果是 session
  // ctx.session.user = null;  session 退出

  // app里边全局定义一个 token黑名单，客户端每次退出将token放到全局名单中，然后在校验登录方法里边做处置，此时这个token还是可以通过校验的正确token
  ctx.blockTokenList.push(ctx.headers.token)
  ctx.tokenExpires({ msg: '退出成功' })
}

// 获取用户名列表
exports.queryUserList = async ctx => {
  // 查询数据
  const res = await findUserList();
  return ctx.success({
    msg: '查询成功',
    result: res
  })
}

// 创建用户
exports.creatUser = async ctx => {
  // 先从token中拿到 当前登录者的roleid看是否有权限创建
  const { type } = ctx.state.user;
  if (type !== ADMIN) ctx.faild({ msg: '无权限创建用户' });

  // 收集参数，提供插入数据库的数据
  const { account, password, role_id } = ctx.request.body;
  if (!account || !password || !role_id) return ctx.faild({ msg: '数据不能为空' });

  const role_name = roles[role_id]
  const insertRes = await insertUser([account, password, role_id, role_name])
  if (insertRes.affectedRows != 1) return ctx.faild({ msg: '数据创建失败' });

  ctx.success({ msg: '数据创建成功', data: insertRes })
}